home *** CD-ROM | disk | FTP | other *** search
- /* Stuff common to both the FTP server and client */
- #include <stdio.h>
- #include "global.h"
- #include "mbuf.h"
- #include "netuser.h"
- #include "timer.h"
- #include "tcp.h"
- #ifdef MAC
- #include "MacBinary.h"
- #endif
- #include "ftp.h"
- #include "session.h"
-
- /* FTP Data channel Receive upcall handler */
- void
- ftpdr(tcb,cnt)
- struct tcb *tcb;
- int16 cnt;
- {
- register struct ftp *ftp;
- struct mbuf *bp;
- char c;
-
- ftp = (struct ftp *)tcb->user;
- if(ftp->state != RECEIVING_STATE){
- close_tcp(tcb);
- return;
- }
- /* This will likely also generate an ACK with window rotation */
- recv_tcp(tcb,&bp,cnt);
-
- #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
- if(ftp->type == ASCII_TYPE){
- while(pullup(&bp,&c,1) == 1){
- if(c != '\r')
- putc(c,ftp->fp);
- }
- return;
- }
- #endif
- while(bp != NULLBUF){
- if(bp->cnt != 0)
- #ifdef MAC
- { if(ftp->MacBinary && ftp->MBftp)
- MBwrite(ftp->mbfp,bp->data,(unsigned)bp->cnt);
- else {
- if(ftp->fp == stdout){
- while(pullup(&bp,&c,1) == 1){
- if(c != '\r')
- putc(c,ftp->fp);
- }
- } else {
- fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
- }
- }
- }
- #else
- fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
- #endif
- bp = free_mbuf(bp);
- }
- }
- /* FTP Data channel Transmit upcall handler */
- void
- ftpdt(tcb,cnt)
- struct tcb *tcb;
- int16 cnt;
- {
- struct ftp *ftp;
- struct mbuf *bp;
- register char *cp;
- register int c;
- int eof_flag;
-
- ftp = (struct ftp *)tcb->user;
- if(ftp->state != SENDING_STATE){
- close_tcp(tcb);
- return;
- }
- if((bp = alloc_mbuf(cnt)) == NULLBUF){
- /* Hard to know what to do here */
- return;
- }
- eof_flag = 0;
- if(ftp->type == IMAGE_TYPE){
- #ifdef MAC
- if(ftp->MacBinary && ftp->MBftp)
- bp->cnt = MBread(ftp->mbfp,bp->data,cnt);
- else
- bp->cnt = fread(bp->data,1,cnt,ftp->fp);
- #else
- bp->cnt = fread(bp->data,1,cnt,ftp->fp);
- #endif
- if(bp->cnt != cnt)
- eof_flag = 1;
- } else {
- cp = bp->data;
- while(cnt > 1){
- if((c = getc(ftp->fp)) == EOF){
- eof_flag=1;
- break;
- }
- #if (defined(CPM) || defined(MSDOS))
- /* ^Z is CP/M's text EOF marker, and it is sometimes used
- * by MS-DOS editors too
- */
- if(c == CTLZ){
- eof_flag = 1;
- break;
- }
- #endif
- #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
- if(c == '\n'){
- *cp++ = '\r';
- bp->cnt++;
- cnt--;
- }
- #endif
- *cp++ = c;
- bp->cnt++;
- cnt--;
- }
- }
- if(bp->cnt != 0)
- send_tcp(tcb,bp);
- else
- free_p(bp);
-
- if(eof_flag){ /* EOF seen */
- #ifdef MAC
- if(ftp->MacBinary && ftp->MBftp){
- MBclose(ftp->mbfp);
- free(ftp->mbfp);
- ftp->mbfp = NULLMBF;
- ftp->MBftp = MACB_OFF;
- }
- else
- fclose(ftp->fp);
- #else
- fclose(ftp->fp);
- #endif
- ftp->fp = NULLFILE;
- close_tcp(tcb);
- }
- }
- /* Allocate an FTP control block */
- struct ftp *
- ftp_create(bufsize)
- unsigned bufsize;
- {
- void ftp_delete();
- register struct ftp *ftp;
-
- if((ftp = (struct ftp *)calloc(1,sizeof (struct ftp))) == NULLFTP)
- return NULLFTP;
- if(bufsize != 0 && (ftp->buf = malloc(bufsize)) == NULLCHAR){
- ftp_delete(ftp);
- return NULLFTP;
- }
- ftp->state = COMMAND_STATE;
- ftp->type = ASCII_TYPE; /* Default transfer type */
- #ifdef MAC
- ftp->MacBinary = MACB_OFF; /* Default is MacBinary off */
- ftp->mbfp = NULLMBF; /* Set to null MB pointer */
- ftp->MBftp = MACB_OFF; /* Default is MacBinary off */
- #endif
- return ftp;
- }
- /* Free resources, delete control block */
- void
- ftp_delete(ftp)
- register struct ftp *ftp;
- {
- #ifdef MAC
- if(ftp->MacBinary)
- if(ftp->mbfp != NULLMBF){
- MBclose(ftp->mbfp);
- free(ftp->mbfp);
- }
- #endif
- if(ftp->fp != NULLFILE && ftp->fp != stdout)
- fclose(ftp->fp);
- if(ftp->data != NULLTCB)
- del_tcp(ftp->data);
- if(ftp->username != NULLCHAR)
- free(ftp->username);
- if(ftp->path != NULLCHAR)
- free(ftp->path);
- if(ftp->buf != NULLCHAR)
- free(ftp->buf);
- if(ftp->cd != NULLCHAR)
- free(ftp->cd);
- if(ftp->session != NULLSESSION)
- freesession(ftp->session);
- free((char *)ftp);
- }
-
-
-